home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / texsis / tables / TXSruled.tex < prev   
Text File  |  1992-08-10  |  19KB  |  409 lines

  1. % file: TXSruled.tex            TeXsis                  version 2.14
  2. % $Revision: 1.3 $  :  $Date: 91/06/02 02:22:54 $  :  $Author: myers $
  3. %======================================================================*
  4. %  RULED TABLES.                                E. Myers and F.E. Paige
  5. %
  6. %       The following macros will typeset tables with vertical and
  7. % horizontal rules. The syntax is similar to Ray Cowan's TABLES.TEX,
  8. % but the macros have been completely rewritten. Vertical and horizontal 
  9. % rules are drawn by macros using vertical spacing controlled by struts.
  10. % Usage:
  11. %       \ruledtable
  12. %       <item> <tab> ... <item> <cr>
  13. %       ...
  14. %       <item> <tab> ... <item> \endruledtable
  15. % where <item> is an element of the table (every row must have exactly 
  16. % the same number of items, although some may be blank), <tab> is any
  17. % one of
  18. %     &                 for no vertical rule
  19. %     |  [or \vb]       for vertical rule
  20. %     \| [or \Vb]       for thick vertical rule
  21. %     \dbl              for double vertical rule
  22. % and <cr> is any one of
  23. %     \nr               for no horizontal rule
  24. %     \cr               for horizontal rule
  25. %     \CR [or \crthick] for thick horizontal rule
  26. % The last <cr> must be omitted in favour of the \endruledtable
  27. %
  28. %  For horizontal rules across only some columns use
  29. %       ... \nr
  30. %       \crule | \cskip & \Crule ... \crpart
  31. % where \crpart is a special \cr for the partial rule line and
  32. %       \cskip          no rule for column
  33. %       \crule          horizontal rule for column
  34. %       \Crule          thick horizontal rule for column
  35. % The number of columns must be identical to the other rows.
  36. %
  37. % To change the appearance of the table, modify \TableItem.
  38. % Several modifications are built in:
  39. %       \LeftJustifyTables      left justify each column
  40. %       \RightJustifyTables     right justify each item
  41. %       \NoJustifyTables        center each item (default)
  42. %       \tablespace             horizontal spacing around each item 
  43. %                               (default is \quad)
  44. %       \TightTables            use \ horizontal spacing
  45. %       \LooseTables            use \quad horizontal spacing (default)
  46. %
  47. % Use \bigitem to expand the vertical strut for high or deep items. 
  48. %
  49. %       These macros have been reorganized and substantially revised from
  50. % version 2.13. The following functional changes have been made:
  51. %       (1) The @ signs have been removed from the names of the macros
  52. % used to save the Plain \cr, \span, and & so that they can be used to
  53. % modify the preamble. See above.
  54. %       (2) Macros for partial horizontal rules have been added.
  55. %       (3) \tabskip glue has been added so that \tablewidth works
  56. % correctly -- the table stretches uniformly over all columns.
  57. %       (4) \linecount has been moved to the \cr macros. It produces a
  58. % warning if the number of columns is different from that in the
  59. % previous row.
  60. %       (5) Trailing spaces in the table items are added to the output.
  61. % A macro \NoTrailingSpaces inserts an \unskip after each item to remove
  62. % them. But this also removes trailing skips unless they are followed by
  63. % an empty \hbox or something similar. This is done automatically for 
  64. % an \hfill (frequently used to left justify an item).
  65. %       The default is \TrailingSpaces, but you may wish to insert
  66. % \NoTrailingSpaces in your TXSsite.tex file.
  67. %       (6) \para uses \normalbaselines rather than specific pt values 
  68. % for the interline spacing and the final strut.
  69. %
  70. % (C) copyright 1990, 1991 by Eric Myers and Frank E. Paige
  71. %======================================================================*
  72. % Counters and such:     
  73. \catcode`@=11                                   % @ is a letter here
  74. \catcode`\|=12                                  % make sure | is not active
  75. \catcode`\&=4                                   % and that & is alignment tab
  76.  
  77. \newcount\ncols         \ncols=\z@              % number of columns in table
  78. \newcount\nrows         \nrows=\z@              % number of rows in table
  79. \newcount\curcol        \curcol=\z@             % current column counter
  80. \let\currow=\nrows                              % current row counter
  81.      
  82. \newdimen\thinsize      \thinsize=0.6pt         % thin rule width
  83. \newdimen\thicksize     \thicksize=1.5pt        % thick rule width
  84. \newdimen\tablewidth    \tablewidth=-\maxdimen  % start ``turned off''
  85. \newdimen\parasize      \parasize=4in           % paragraph size in tables
  86.  
  87. \newif\iftableinfo      \tableinfotrue          % report rows and columns? Yes
  88. \newif\ifcentertables   \centertablestrue       % center tables? Yes
  89. \def\centeredtables{\centertablestrue}%
  90. \def\noncenteredtables{\centertablesfalse}%
  91. \def\nocenteredtables{\centertablesfalse}%      % synonym !
  92.      
  93. \let\plaincr=\cr                        % save real \cr
  94. \let\plainspan=\span                    % save real \span
  95. \let\plaintab=&                         % save real alignment tab &
  96. \def\ampersand{\char`\&}%               % to print `&' in text
  97. \let\lparen=(                           % save left paren     
  98. \let\NX=\noexpand                       % shorthand for \noexpand is \NX
  99.  
  100. %---------------------------------------*
  101. % Main macros:
  102. %       \ruledtable <table stuff> \endruledtable turns on the ruled
  103. % table definitions and makes the table with \halign. It handles all
  104. % the control stuff; the real work is done by \@RuledTable.
  105.      
  106. \def\ruledtable{\relax                          % make ruled table
  107.     \@BeginRuledTable                           % initialize table
  108.     \@RuledTable}%                              % now process table body
  109.  
  110. %  \@BeginRuledTable does all the work of setting things up before
  111. % we read in the body of the table
  112.  
  113. \def\@BeginRuledTable{%                         % initialize table
  114.    \ncols=0\nrows=0                             % reset row and column count
  115.    \begingroup                                  % keep the following local
  116.     \offinterlineskip                           % so vrules touch
  117.     \def~{\phantom{0}}%                         % ~ is phantom digit
  118.     \def\span{\plainspan\omit\relax\colcount\plainspan}%  \span USER columns
  119.     \let\cr=\crrule                             % \cr gives a \tablerule
  120.     \let\CR=\crthick                            % \CR gives a \thickrule
  121.     \let\nr=\crnorule                           % \nr give no rule
  122.     \let\|=\Vb                                  % thick vrule between columns
  123.     \def\hfill{\hskip0pt plus1fill\hbox{}}%     % so it is not removed
  124. % support old \tablestrut in place of \tstrut if it exists
  125. %
  126.     \ifx\tablestrut\undefined\relax             % if not defined, no problem
  127.     \else\let\tstrut=\tablestrut\fi             % use \tablestrut
  128. %
  129.     \catcode`\|=13 \catcode`\&=13\relax         % make | and & active
  130.     \TableActive                                % | and & get active \def`s
  131.     \curcol=1                                   % reset column count
  132. %
  133. % define \Halign to do an \halign with or without a width
  134. %
  135.     \ifdim\tablewidth>-\maxdimen\relax          %
  136.       \edef\@Halign{\NX\halign to \NX\tablewidth\NX\bgroup\TablePreamble}% 
  137.       \tabskip=0pt plus 1fil                    % let things stretch
  138.     \else                                       %
  139.       \edef\@Halign{\NX\halign\NX\bgroup\TablePreamble}% 
  140.       \tabskip=0pt                              % no stretch between columns
  141.     \fi                                         %
  142. %
  143. % center text if needed
  144. %
  145.     \ifcentertables                             % should table be centered?
  146.        \ifhmode\vskip 0pt\fi                    % yes: force vertical mode
  147.        \line\bgroup\hss                         % center across page
  148.     \else\hbox\bgroup                           % else: just put in \hbox
  149.     \fi}%                                       % end of \@BeginRuledTable
  150.  
  151.  
  152. %       \@RuledTable builds the table with \@Halign and getting the
  153. % table body text as its argument.
  154.  
  155. \long\def\@RuledTable#1\endruledtable{%         % ruled table alignment
  156.    \vrule width\thicksize                       % thick rule on side
  157.      \vbox{\@Halign                             % then do \halign
  158.        \thickrule                               % thick rule on top
  159.        #1\killspace                             % body of table
  160.        \tstrut                                  % vertical strut for last line
  161.        \linecount                               % count this line
  162.        \plaincr\thickrule                       % \cr, thick rule on bottom
  163.      \egroup}%                                  % end of \halign and \vbox
  164.    \vrule width\thicksize                       % thick rule on side, end \hbox
  165.    \ifcentertables\hss\fi\egroup                % finish table centering
  166.   \endgroup                                     % end group from \ruledtable
  167.   \global\tablewidth=-\maxdimen                 %   and reset width
  168.   \iftableinfo                                  % report rows and columns
  169.       \immediate\write16{[Nrows=\the\nrows, Ncols=\the\ncols]}%
  170.    \fi}%                                        % end of \@RuledTable
  171.      
  172. %---------------------------------------*
  173. % Preamble and item macros:
  174. %       \TablePreamble is the preamble for the \halign in \ruledtable. 
  175. %       To change how each item is processed change \TableItem.  
  176. %       To make a more complicated table you can change \TablePreamble,
  177. % but if you do so use the following substitutions in a standard \halign 
  178. % preamble:
  179. %    for  &     use     \plaintab
  180. %    for  \cr   use     \plaincr
  181. %    for  #     use     ##
  182. %    for  ##    use     ####
  183.  
  184. \def\TablePreamble{%                    % \ruledtable preamble
  185.    \TableItem{####}%                    % the first item
  186.    \plaintab\plaintab                   % && means repeat this
  187.    \TableItem{####}%                    % the subsequent items
  188.    \plaincr}%                           % end of preamble
  189.  
  190.  
  191. %       \TableItem contains glue or spacing around the item
  192.  
  193. \def\@TableItem#1{%                     % centers item in ruled table
  194.    \hfil\tablespace                     % left glue
  195.    #1\killspace%                        % item
  196.    \tablespace\hfil                     % right glue
  197.     }%
  198.  
  199. \def\@tableright#1{%                    % right justifies item in ruled table
  200.    \hfil\tablespace\relax               % left glue
  201.    #1\killspace%                        % item
  202.    \tablespace\relax}%                  % right glue
  203.  
  204. \def\@tableleft#1{%                     % left justifies item in ruled table
  205.    \tablespace\relax                    % left glue
  206.    #1\killspace%                        % item
  207.    \tablespace\hfil}%                   % right glue
  208.  
  209. \let\TableItem=\@TableItem              % default is centered
  210.      
  211. \def\RightJustifyTables{\let\TableItem=\@tableright}%   % to right justify
  212. \def\LeftJustifyTables{\let\TableItem=\@tableleft}%     % to left justify
  213. \def\NoJustifyTables{\let\TableItem=\@TableItem}%       % to center
  214.  
  215.  
  216. %       \TightTables makes the spacing of a table as tight as possible.
  217. % \LooseTables, the default, gives more pleasing spacing.
  218.  
  219. \def\LooseTables{\let\tablespace=\quad}%        % table spacing is \quad
  220. \def\TightTables{\let\tablespace=\space}%       % table spacing is space
  221. \LooseTables                                    % default is \quad
  222.  
  223.  
  224. %       \TrailingSpaces, the default, allows trailing spaces and glue
  225. % to change the appearance of a table. \NoTrailingSpaces removes all
  226. % trailing spaces and glue before inserting the table glue.
  227.  
  228. \def\TrailingSpaces{\let\killspace=\relax}      % do not kill trailing space
  229. \def\NoTrailingSpaces{\let\killspace=\unskip}   % kill trailing space
  230. \TrailingSpaces                                 % default
  231.  
  232. %---------------------------------------*
  233. % Table Height and Width:
  234. %
  235. %  Normally tables are set to their natural width.  If \tablewidth
  236. %  has been set then we set the table to that width instead,
  237. %  but only for the next table.  Then \tablewidth is turned off
  238.  
  239. %      \setRuledStrut sets up the vertical strut \tstrut with
  240. % the appropriate dimensions to hold up one line of a ruled table. 
  241.  
  242. \def\setRuledStrut{% sets interlines spacing for ruled tables
  243.    \dimen@=\baselineskip                        % \dimen@ = extra space
  244.    \advance\dimen@ by-\normalbaselineskip       % between lines
  245.    \ifdim\dimen@<.5ex \dimen@=.5ex\fi           % minimum space
  246.    \setbox0=\hbox{\lparen}%                     % get character size
  247.    \dimen1=\dimen@ \advance\dimen1 by \ht0      % space above line
  248.    \dimen2=\dimen@ \advance\dimen2 by \dp0      % space below line
  249.    \def\tstrut{\vrule height\dimen1 depth\dimen2 width\z@}%
  250.    }%
  251.  
  252. \def\tstrut{\vrule height 3.1ex depth 1.2ex width 0pt}%  default
  253.  
  254.  
  255. %      \tstrut does not produce the correct spacing if the entry in
  256. % the table is too high. The following constructs a strut higher than its
  257. % argument and then prints the argument. The minimum space value should
  258. % be the same as in \setRuledStrut. 
  259.  
  260. \def\bigitem#1{%                                % larger table entry
  261.    \dimen@=\baselineskip                        % \dimen@ = extra space
  262.    \advance\dimen@ by-\normalbaselineskip       % between lines
  263.    \ifdim\dimen@<.5ex \dimen@=.5ex\fi           % minimum space
  264.    \setbox0=\hbox{#1}%                          % get argument size
  265.    \dimen1=\dimen@ \advance\dimen1 by \ht0      % space above line
  266.    \dimen2=\dimen@ \advance\dimen2 by \dp0      % space below line
  267.    \vrule height\dimen1 depth\dimen2 width\z@   % make strut to size
  268.    \copy0}%                                     % print argument
  269.  
  270.  
  271. %       \vctr{stuff} centers the stuff vertically, so that it can
  272. % appear between two ROWS.
  273.      
  274. \def\vctr#1{\hfil\vbox to 0pt{\vss\hbox{#1}\vss}\hfil}%
  275.  
  276. %---------------------------------------*
  277. % Vertical rules:
  278. %       \tab, \vb and \Vb are used in a table to separate columns with no
  279. % rule, a thin rule, or a thick rule, respectively.  \nextcolumn{<rule>} skips
  280. % to  the next column and puts the <rule> between columns.  Use this to build
  281. % your own separators.
  282.      
  283. \def\nextcolumn#1{%                             % move to next col.
  284.    \plaintab\omit#1\relax\colcount              % tab, insert #1, count
  285.    \plaintab}%                                  % tab to next user col.
  286.      
  287. \def\tab{%                                      % no rule between columns
  288.    \nextcolumn{\relax}}%                        % count column
  289.  
  290. \let\novb=\tab                                  % synonym for \tab
  291.  
  292. \def\vb{%                                       % thin rule between columns
  293.    \nextcolumn{\vrule width\thinsize}}%         % count and rule
  294.  
  295. \def\Vb{%                                       % THICK rule between columns
  296.    \nextcolumn{\vrule width\thicksize}}%        % count and thick rule
  297.  
  298. \def\dbl{%                                      % double rule between columns
  299.    \nextcolumn{\vrule width\thinsize            % count and rule
  300.    \hskip\thinsize\vrule width\thinsize}}%      % and skip and rule
  301.  
  302. %       \TableActive makes | the same as \vb and & the same as \tab so
  303. % these single characters can be used between columns. Here we have to
  304. % make & and | active so we get the active version of the characters,
  305. % hence the temporary change of \catcode.
  306.      
  307. {\catcode`\|=13 \let|0
  308.  \catcode`\&=13 \let&0
  309.  \gdef\TableActive{\let|=\vb \let&=\tab}%
  310. }% end \catcode`s
  311.  
  312. %---------------------------------------*
  313. % Horizontal rules:
  314. %       These replacements for \cr put a wide \vrule at the end of the
  315. % line and maybe put a rule under the line, then begin the next line
  316. % with the wide \vrule from the preamble.
  317.      
  318.  
  319. \def\crrule{\killspace                  % \cr plus rule
  320.    \tstrut                              % strut for spacing
  321.    \linecount                           % count this line
  322.    \plaincr\tablerule                   % \cr, regular rule below line
  323.   }%
  324.  
  325. \def\crthick{\killspace                 % \cr plus thick rule
  326.    \tstrut                              % strut for vertical spacing
  327.    \linecount                           % count this line
  328.    \plaincr\thickrule                   % \cr, rule, begin next line
  329.   }%                
  330.      
  331. \def\crnorule{\killspace                % \cr plus no rule
  332.    \tstrut                              % strut for spacing
  333.    \linecount                           % count this line
  334.    \plaincr                             % \cr, norule, begin next line
  335.    }%
  336.    
  337. \def\crpart{\killspace                  % end partial rule line
  338.    \linecount                           % count this line
  339.    \plaincr}                            % and end it
  340.  
  341.  
  342. %       These rules go across the table.
  343.      
  344. \def\tablerule{\noalign{\hrule height\thinsize depth 0pt}}%
  345. \def\thickrule{\noalign{\hrule height\thicksize depth 0pt}}%
  346.  
  347.  
  348. %       Rules for individual columns. You must use \cskip in columns
  349. % with no rules to \omit the \TablePreamble.
  350.  
  351. \def\cskip{\omit\relax}%
  352. \def\crule{\omit\leaders\hrule height\thinsize depth0pt\hfill}%
  353. \def\Crule{\omit\leaders\hrule height\thicksize depth0pt\hfill}%
  354.      
  355. %---------------------------------------*
  356. % Counting macros:     
  357. %       These macros count rows and columns of the table. After the
  358. % first line has been processed \the\ncols is the total number of
  359. % columns in the table, which may be useful. During processing,
  360. % \the\curcol is the number of the current column, while \the\currow is
  361. % the number of the current row.
  362.      
  363.  
  364. \def\linecount{%                                % count and check row
  365.    \global\advance\nrows by1%                   % advance row counter
  366.    \ifnum\ncols>0%                              % if \ncols set
  367.       \ifnum\curcol=\ncols\relax\else           % if new \ncols different
  368.       \immediate\write16%                       %   then write message
  369.       {\NX\ruledtable warning: Ncols=\the\curcol\space for Nrow=\the\nrows}%
  370.       \fi\fi                                    % end of tests
  371.    \global\ncols=\curcol                        % save columns in \ncols
  372.    \global\curcol=1}                            % reset counter
  373.  
  374. \def\colcount{\relax                            %
  375.    \global\advance\curcol by 1\relax}%          % advance column counter
  376.  
  377. %---------------------------------------*
  378. % TEXT TABLES.
  379. %       To put text in a table use \para{<text>}, with \parasize set
  380. %  to the desired width of the text.
  381.  
  382. \long\def\para#1{%                      % make a paragraph for tables
  383.    \vtop{\hsize=\parasize               % width - set before \para called
  384.    \normalbaselines                     % set normal baseline skips
  385.    \noindent #1\relax                   % insert text
  386.    \vrule width 0pt depth 1.1ex}%       % hold depth of box
  387. }%
  388.  
  389. %---------------------------------------*
  390. % TABLES.TEX
  391. %   For compatability with Cowan's TABLES.TEX we also allow the
  392. % syntax \begintable ... \endtable, which do the same thing.
  393. %
  394.  
  395. \def\begintable{\relax                          % make ruled table
  396.     \@BeginRuledTable                           % initialize table
  397.     \@begintable}%                              % now process table body
  398.  
  399. \long\def\@begintable#1\endtable{%              % ruled table alignment
  400.    \@RuledTable#1\endruledtable}%               % same as \ruledtable
  401.  
  402. %---------------------------------------*
  403. % Turn off @ as letter before we exit
  404.  
  405. \catcode`@=12                                   % @ is not a letter
  406.  
  407. %>>> EOF TXSruled.tex <<<
  408.